package com.xbongbong.paas.enums;

import com.xbongbong.i18n.util.I18nMessageUtil;
import com.xbongbong.paas.constant.XbbConstant;
import com.xbongbong.paas.enums.clazz.AggsTypeClass;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 统计方式
 * @author 梁鲁江
 * @version v1.0
 * @date 2019/1/22 20:21
 * @since v1.0
 */
public enum AggTypeEnum {
    /**
     * 统计方式
     */
    SUM(1, "sum", "enum.aggType.name.sum"),
    AVG(2, "avg", "enum.aggType.name.avg"),
    MIN(3, "min", "enum.aggType.name.min"),
    MAX(4, "max", "enum.aggType.name.max"),
    COUNT(5, "count", "enum.aggType.name.count"),
    //目前只有统计表的计算字段有使用到agg类型
    AGG(6,"agg","enum.aggType.name.agg")
    ;
    private int code;
    private String alias;
    private String name;

    AggTypeEnum(int code, String alias, String name) {
        this.code = code;
        this.alias = alias;
        this.name = name;
    }

    /**
     * 取MAX、MIN相反的alisa
     *
     * @param aggType
     * @return java.lang.String
     * @author zyy
     * @date 2023/2/28
     * @version v1.0
     */
    public static String reverseMaxOrMin(AggTypeEnum aggType) {
        if(Objects.equals(aggType,MIN)){
            return MAX.getAlias();
        }
        if(Objects.equals(aggType,MAX)){
            return MIN.getAlias();
        }
        return "";
    }

    /**
     * 取MAX、MIN行维度函数前缀
     *
     * @param aggAlisa
     * @return java.lang.String
     * @author zyy
     * @date 2023/2/28
     * @version v1.0
     */
    public static String getRowAlias4MaxOrMin(String aggAlisa) {
        if(MAX.getAlias().equals(aggAlisa)){
            return "greatest";
        }
        if (MIN.getAlias().equals(aggAlisa)){
            return "least";
        }
        return "";
    }

    public int getCode() {
        return code;
    }

    public String getAlias() {
        return alias;
    }

    public String getName() {
        return I18nMessageUtil.getMessage(name);
    }

    public static List<AggTypeEnum> getAllEnum() {
        List<AggTypeEnum> list = new ArrayList<>();
        for (AggTypeEnum cache : values()) {
            list.add(cache);
        }
        return list;
    }

    public static List<AggsTypeClass> list() {
        List<AggsTypeClass> list = new ArrayList<>();
        for (AggTypeEnum cache : values()) {
            AggsTypeClass aggsTypeClass = new AggsTypeClass();
            aggsTypeClass.setAlias(cache.getCode());
            aggsTypeClass.setName(cache.getName());
            list.add(aggsTypeClass);
        }
        return list;
    }

    /**
     * 根据code获取对应的枚举值，默认给SUM
     * @param code
     * @return
     */
    public static AggTypeEnum getByCode(Integer code) {
        if(code != null){
            for (AggTypeEnum cacheCode : values()) {
                if (Objects.equals(cacheCode.getCode(), code)) {
                    return cacheCode;
                }
            }
        }
        //默认给sum
        return SUM;
    }
    public static List<AggsTypeClass> getListByCode(Integer code) {
        List<AggsTypeClass> list = new ArrayList<>();
        for (AggTypeEnum cache : values()) {
            if (Objects.equals(cache.getCode(), code)) {
                AggsTypeClass aggsTypeClass = new AggsTypeClass();
                aggsTypeClass.setAlias(cache.getCode());
                aggsTypeClass.setName(cache.getName());
                list.add(aggsTypeClass);
                continue;
            }
        }
        return list;
    }

    /**
     * 根据alias获取对应的枚举值，默认给SUM
     * @param alias 别名
     * @return AggTypeEnum
     */
    public static AggTypeEnum getByAlias(String alias) {
        if(alias != null){
            for (AggTypeEnum cacheCode : values()) {
                if (Objects.equals(cacheCode.getAlias(), alias)) {
                    return cacheCode;
                }
            }
        }
        //默认给sum
        return SUM;
    }

    /**
     * 判断是否为Agg汇总类型
     * true-是， false-否
     *
     * @param aggTypeEnum
     * @return boolean
     * @author zyy
     * @date 2022/10/8
     * @version v1.0
     */
    public static boolean isAggType(AggTypeEnum aggTypeEnum){
        return Objects.equals(aggTypeEnum,AggTypeEnum.AGG);
    }

    /**
     * 计算字段使用 - 不支持走聚合逻辑的情况
     *
     * @param aggType
     * @param formulaName
     * @return boolean
     * @author zyy
     * @date 2023/1/10
     * @version v1.0
     */
    public static boolean notSupportAgg(AggTypeEnum aggType, String formulaName) {
        //聚合类型  && 逻辑公式 + 日期公式
        return (isAggType(aggType) &&
                ("MIN".equals(formulaName)
                        || "MAX".equals(formulaName)
                        || "IF".equals(formulaName)
                        || "DATE_DIFF".equals(formulaName)));
    }

    /**
     * 根据不同的汇总方式拼接SQL
     *
     * @param aggAlisa 聚合函数前缀字符串
     * @param contentSql 主体SQL
     * @param asAttr 字段别名
     * @return java.lang.String
     * @author zyy
     * @date 2023/2/10
     * @version v1.0
     */
    public static String assembleSqlByType(String aggAlisa,String contentSql,String asAttr){
        //contentSql外层已经包裹（）了
        return aggAlisa.toUpperCase() + contentSql + XbbConstant.AS + asAttr;
    }

}
